package com.zjsru.plan2024.oneday;

import java.util.Arrays;

/**
 * 910. 最小差值 II
 *
 * @Author: cookLee
 * @Date: 2024-10-21
 */
public class SmallestRangeII {

    /**
     * 主
     * \
     * 输入：nums = [1], k = 0
     * 输出：0
     * 解释：分数 = max(nums) - min(nums) = 1 - 1 = 0 。
     * \
     * 输入：nums = [0,10], k = 2
     * 输出：6
     * 解释：将数组变为 [2, 8] 。分数 = max(nums) - min(nums) = 8 - 2 = 6 。
     * \
     * 输入：nums = [1,3,6], k = 3
     * 输出：3
     * 解释：将数组变为 [4, 6, 3] 。分数 = max(nums) - min(nums) = 6 - 3 = 3 。
     * \
     *
     * @param args args
     */
    public static void main(String[] args) {
        SmallestRangeII smallestRangeII = new SmallestRangeII();
        int[] nums = new int[]{1, 3, 6};
        int k = 3;
        System.out.println(smallestRangeII.smallestRangeII(nums, k));
    }

    /**
     * 最小范围ii
     *
     * @param nums nums
     * @param k    k
     * @return int
     */
    public int smallestRangeII(int[] nums, int k) {
        Arrays.sort(nums);
        int len = nums.length;
        //获取均值
        int min = nums[0];
        int max = nums[len - 1];
        //初始的最大差值
        int res = max - min;
        for (int i = 0; i < len - 1; i++) {
            int first = nums[i];
            int second = nums[i + 1];
            //调整后的最大值，要么是原数组最大值减去k，要么是当前遍历到的当前元素加上k
            //调整后的最小值，要么是原数组最小值加上k，要么是当前遍历到的后一个元素减去k
            int sub = Math.max(max - k, first + k) - Math.min(min + k, second - k);
            res = Math.min(res, sub);
        }
        return res;
    }
}
